package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import com.sky.vo.SetmealVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartMapper shoppingCartMapper;

    @Autowired
    private DishMapper dishMapper;

    @Autowired
    private SetmealMapper setmealMapper;

    /**
     * 向购物车中添加商品（菜品或套餐）
     * 该方法会根据传入的购物车数据传输对象，判断当前用户购物车中是否已存在相同商品：
     * - 如果不存在，则查询商品信息并新增一条购物车记录；
     * - 如果已存在，则将原有记录的数量加一。
     * @param dto 购物车数据传输对象，包含要添加的商品信息（如菜品ID、套餐ID、口味等）
     */
    @Override
    public void addCart(ShoppingCartDTO dto) {
        //创建ShoppingCart对象
        ShoppingCart shoppingCart = new ShoppingCart();
        //拷贝属性值
        BeanUtils.copyProperties(dto,shoppingCart);

        //1.判断该商品是否已经在购物车中存在--条件：dishId+dishFlavor+userId
        //只查当前用户自己的购物车
        shoppingCart.setUserId(BaseContext.getCurrentId());
        ShoppingCart cart=shoppingCartMapper.selectBy(shoppingCart);

        if(cart==null){   //代表购物车中没有该商品数据
            //2.补充丢失的属性值
            //判断是新增套餐还是新增菜品
            if(dto.getDishId()!=null){   //代表新增的是菜品
                //根据菜品的id查询菜品表，获取菜品相关信息
                Dish dish = dishMapper.getById(dto.getDishId());
                shoppingCart.setName(dish.getName());
                shoppingCart.setImage(dish.getImage());
                shoppingCart.setAmount(dish.getPrice());
            }else{         //代表新增的是套餐
                SetmealVO setmealVO = setmealMapper.getById(dto.getSetmealId());
                shoppingCart.setName(setmealVO.getName());
                shoppingCart.setImage(setmealVO.getImage());
                shoppingCart.setAmount(setmealVO.getPrice());
            }
            shoppingCart.setNumber(1);  //数量-->到底是1还是+1？判断商品是否已经在购物车中存在
            shoppingCart.setCreateTime(LocalDateTime.now());

            //3.将商品数据存入到shopping_cart表中
            shoppingCartMapper.insert(shoppingCart);
        }else{          //代表购物车中已经存在该商品数据
            //4.将原来的购物车商品数据+1，调用mapper层更新方法
            cart.setNumber(cart.getNumber()+1);
            shoppingCartMapper.update(cart);
        }

        //最后将用户添加的商品，存入到shopping_cart购物车表中
    }

    /**
     * 查询当前用户的购物车列表
     *
     * @return 购物车列表
     */
    @Override
    public List<ShoppingCart> list() {
        // 获取当前用户ID并查询其购物车列表
        return shoppingCartMapper.list(BaseContext.getCurrentId());
    }

    /**
     * 清空当前用户购物车中的所有商品
     *
     * 该方法会删除当前登录用户购物车中的所有数据，
     * 只能操作当前用户自己名下的购物车记录。
     *
     * 注意：此操作会永久删除购物车数据，请谨慎使用
     */
    @Override
    public void clean() {
        //注意：只能清空自己名下的购物车数据
        shoppingCartMapper.delete(BaseContext.getCurrentId());
    }

    /**
     * 减少购物车中商品的数量
     *
     * @param dto 购物车数据传输对象，包含要减少的商品信息
     */
    @Override
    public void sub(ShoppingCartDTO dto) {
        //1.首先查询一下购物车中的这条商品的数量
        //创建ShoppingCart对象
        ShoppingCart shoppingCart = new ShoppingCart();
        //拷贝属性值
        BeanUtils.copyProperties(dto,shoppingCart);

        //查询的条件：dishId+dishFlavor+userId
        //只查当前用户自己的购物车
        shoppingCart.setUserId(BaseContext.getCurrentId());
        ShoppingCart cart=shoppingCartMapper.selectBy(shoppingCart);
        //2.如果商品数量大于1，则将商品数量减1
        if(cart.getNumber()>1){
            cart.setNumber(cart.getNumber()-1);
            shoppingCartMapper.update(cart);
        }else{   //3.如果商品数量等于1，则将这条数据从购物车中删除
            shoppingCartMapper.deleteById(cart.getId());
        }

    }



}
